package manager.modulo.clientefornecedor.dao;

import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.auxiliares.MensagemExcessao;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class CentroCustoDao implements InterfaceDao {

    int id;
    String nome;
    String observacao;
    int idClienteFornecedor;

    /**
     * Inicializando as variáveis
     */
    public CentroCustoDao() {
        nome = "";
        idClienteFornecedor = 0;
        observacao = "";
    }

    public static int getIdCentroCustoPorNome(String codigo) {
        try {

            String sql = "SELECT id FROM centro_custo WHERE tx_nome = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, codigo);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Centros de Custos");
            return 0;
        }
    }

    public void inserir() throws SQLException {
        String sql = "INSERT INTO centro_custo (tx_nome,id_cliente_fornecedor,tx_observacao) VALUES(?,?,?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);

        preparedStatement.setString(1, nome);
        preparedStatement.setInt(2, idClienteFornecedor);
        preparedStatement.setString(3, observacao);
        preparedStatement.executeUpdate();

        preparedStatement.close();
    }

    public void atualizar() throws SQLException {
        String sql = "UPDATE centro_custo SET tx_nome= ?, id_cliente_fornecedor = ? , tx_observacao = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, nome);
        preparedStatement.setInt(2, idClienteFornecedor);
        preparedStatement.setString(3, observacao);
        preparedStatement.setInt(4, id);
        preparedStatement.executeUpdate();

        preparedStatement.close();
    }

    public void deletar() throws SQLException {
    }

    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM centro_custo WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                nome = resultSet.getString("tx_nome");
                observacao = resultSet.getString("tx_observacao");
                idClienteFornecedor = resultSet.getInt("id_cliente_fornecedor");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Centros de Custo");
        }
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Nome")) {// Buscando por Nome
                sql = "SELECT tx_nome FROM centro_custo WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Cliente/Fornecedor")) {// Buscando por Nome
                sql = "SELECT tx_identificador FROM cliente_fornecedor WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public LinkedList<String> buscarCentroCustoPorClienteFornecedor(String opcao, String palavraBuscada, int idClienteFornecedor, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Nome")) {// Buscando por Nome
                sql = "SELECT tx_nome FROM centro_custo WHERE tx_nome LIKE ? AND id_cliente_fornecedor = " + idClienteFornecedor + " ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }
    
        public static LinkedList searchTable(String option, String search) throws SQLException {
        LinkedList result = new LinkedList();
        if (!search.equals("")) {
            String sql = "";
            if (option.equalsIgnoreCase("Nome")) { // Buscando por email
                sql = "SELECT "
                        + " c.id AS IdCentroCusto,"
                        + " c.tx_nome AS Nome,"
                        + " cf.tx_identificador AS ClienteFornecedor "
                        + "FROM "
                        + " centro_custo c "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = c.id_cliente_fornecedor "
                        + "WHERE "
                        + " c.tx_nome LIKE ? "
                        + "ORDER BY c.tx_nome";
                search += "%";
            } else if (option.equalsIgnoreCase("Cliente/Fornecedor")) { // Buscando por email
                sql = "SELECT "
                        + " c.id AS IdCentroCusto,"
                        + " c.tx_nome AS Nome,"
                        + " cf.tx_identificador AS ClienteFornecedor "
                        + "FROM "
                        + " centro_custo c "
                        + " INNER JOIN cliente_fornecedor cf ON cf.id = c.id_cliente_fornecedor "
                        + "WHERE "
                        + " cf.tx_identificador LIKE ? "
                        + "ORDER BY c.tx_nome";
                search += "%";
            } 
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaNome = new LinkedList<String>();
                LinkedList<String> colunaClienteFornecedor = new LinkedList<String>();
                LinkedList<Integer> columnId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    columnId.add(resultSet.getInt("IdCentroCusto"));
                    colunaNome.add(resultSet.getString("Nome"));
                    colunaClienteFornecedor.add(resultSet.getString("ClienteFornecedor"));
                }

                result.add(columnId);
                result.add(Format.getBooleanLinkedList(columnId.size()));
                result.add(colunaNome);
                result.add(colunaClienteFornecedor);
                result.add(Format.getBooleanLinkedList(columnId.size()));
            }
        }
        return result;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getIdClienteFornecedor() {
        return idClienteFornecedor;
    }

    public void setIdClienteFornecedor(int idClienteFornecedor) {
        this.idClienteFornecedor = idClienteFornecedor;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }
}
